package com.yeskery.nut.http.controller;

import com.yeskery.nut.core.*;
import com.yeskery.nut.util.Base64ImageUtils;

import java.io.InputStream;

/**
 * <p>默认的 icon <code>Controller</code>，该 <code>Controller</code> 会返回 Nut 的 icon，
 * 如果需要自定义 icon 可以在 {@link com.yeskery.nut.core.ControllerManager} 中重新注册
 * 一个自定义的 <code>Controller</code>，并将 <code>Controller</code> 的路径设置为
 * <code>/favicon.ico</code>。</p>
 *
 * <p>也可以在classpath下放置名为<code>favicon.ico</code>的文件，Nut会自动读取该文件并返回。</p>
 *
 * @author sprout
 * 2019-03-16 11:56
 * @version 1.0
 *
 * @see com.yeskery.nut.core.Controller
 */
public class FaviconController implements Controller {

	/** 默认路径 */
	public static final String DEFAULT_PATH = "/favicon.ico";

	/** 默认icon */
	private static final String DEFAULT_ICON_IMAGE_BASE64 = "";

	/** 是否使用默认icon */
	private Boolean useDefaultIcon;

	@Override
	public void doGet(Request request, Response response, Execution execution) {
		if (useDefaultIcon == null) {
			InputStream inputStream = getIconImageInputStream();
			useDefaultIcon = inputStream == null;
			doResponse(response, inputStream);
		} else {
			doResponse(response, null);
		}
	}

	/**
	 * 响应
	 * @param response 响应
	 */
	private void doResponse(Response response, InputStream inputStream) {
		if (useDefaultIcon) {
			response.write(Base64ImageUtils.base64ToImageArray(DEFAULT_ICON_IMAGE_BASE64), MediaType.IMAGE_X_ICON);
		} else {
			response.write(inputStream != null ? inputStream : getIconImageInputStream(), MediaType.IMAGE_X_ICON);
		}
	}

	/**
	 * 获取icon图片输入流
	 * @return icon图片输入流
	 */
	private InputStream getIconImageInputStream() {
		return this.getClass().getResourceAsStream(DEFAULT_PATH);
	}
}
